{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uJHywE_oL3j2"
      },
      "source": [
        "# Simple NN with Flax.\n",
        "\n",
        "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.sandbox.google.com/github/google-deepmind/optax/blob/main/examples/flax_example.ipynb)\n",
        "\n",
        "This notebook trains a simple one-layer NN with Optax and Flax. For more advanced applications of those two libraries, we recommend checking out the [`cifar10_resnet`](https://colab.sandbox.google.com/github/google-deepmind/optax/blob/main/examples/cifar10_resnet.ipynb) example."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "2UQeQxFzdrzd"
      },
      "outputs": [],
      "source": [
        "import jax\n",
        "import jax.numpy as jnp\n",
        "import optax\n",
        "import matplotlib.pyplot as plt\n",
        "from flax import linen as nn"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "YSqWu8a_dl4Q"
      },
      "outputs": [],
      "source": [
        "# @markdown Learning rate for the optimizer:\n",
        "LEARNING_RATE = 1e-2  # @param{type:\"number\"}\n",
        "# @markdown Number of training steps:\n",
        "NUM_STEPS = 100  # @param{type:\"integer\"}\n",
        "# @markdown Number of samples in the training dataset:\n",
        "NUM_SAMPLES = 20  # @param{type:\"integer\"}\n",
        "# @markdown Shape of the input:\n",
        "X_DIM = 10  # @param{type:\"integer\"}\n",
        "# @markdown Shape of the target:\n",
        "Y_DIM = 5  # @param{type:\"integer\"}\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MNo8j9Fmmm7H"
      },
      "source": [
        "In this cell, we initialize a random number generator (RNG) and use it to create separate RNGs for all randomness-related things."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "nmrlbUqQeEGo"
      },
      "outputs": [],
      "source": [
        "rng = jax.random.PRNGKey(0)\n",
        "params_rng, w_rng, b_rng, samples_rng, noise_rng = jax.random.split(rng, num=5)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "l2aAe-CXoE8Z"
      },
      "source": [
        "In the next cell, we define a model and obtain its initial parameters."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "LrKhX5XUeLqg"
      },
      "outputs": [],
      "source": [
        "# Creates a one linear layer instance.\n",
        "model = nn.Dense(features=Y_DIM)\n",
        "\n",
        "# Initializes the parameters.\n",
        "params = model.init(params_rng, jnp.ones((X_DIM,), dtype=jnp.float32))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FvOlOg5ag4uZ"
      },
      "source": [
        "In the next cell we generate our training data.\n",
        "\n",
        "We will be approximating a function of the form `y = wx + b`, hence why we generate `w`, `b`, training samples `x` and obtain `y`, using the formula above."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "rHgo4HHxef4D"
      },
      "outputs": [],
      "source": [
        "# Generates ground truth w and b.\n",
        "w = jax.random.normal(w_rng, (X_DIM, Y_DIM))\n",
        "b = jax.random.normal(b_rng, (Y_DIM,))\n",
        "\n",
        "# Generates training samples.\n",
        "x_samples = jax.random.normal(samples_rng, (NUM_SAMPLES, X_DIM))\n",
        "y_samples = jnp.dot(x_samples, w) + b\n",
        "# Adds noise to the target.\n",
        "y_samples += 0.1 * jax.random.normal(noise_rng, (NUM_SAMPLES, Y_DIM))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rNdtDg4ukJB3"
      },
      "source": [
        "Next we define a custom MSE loss function."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ikgNAXm0fKM1"
      },
      "outputs": [],
      "source": [
        "def make_mse_func(x_batched, y_batched):\n",
        "  def mse(params):\n",
        "    # Defines the squared loss for a single (x, y) pair.\n",
        "    def squared_error(x, y):\n",
        "      pred = model.apply(params, x)\n",
        "      return jnp.inner(y-pred, y-pred) / 2.0\n",
        "    # Vectorizes the squared error and computes mean over the loss values.\n",
        "    return jnp.mean(jax.vmap(squared_error)(x_batched, y_batched), axis=0)\n",
        "  return jax.jit(mse)  # `jit`s the result.\n",
        "\n",
        "# Instantiates the sampled loss.\n",
        "loss = make_mse_func(x_samples, y_samples)\n",
        "\n",
        "# Creates a function that returns value and gradient of the loss.\n",
        "loss_grad_fn = jax.value_and_grad(loss)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8-Lm815FrcDD"
      },
      "source": [
        "In the next cell, we construct a simple Adam optimizer using Optax gradient transformations passed to the `optax.chain`.\n",
        "\n",
        "The same result can be achieved by using the `optax.adam` alias. However, here, we demonstrate how to work with gradient transformations manually so that you can build your own custom optimizer if needed."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "F7aS_-dofapt"
      },
      "outputs": [],
      "source": [
        "tx = optax.chain(\n",
        "    # Sets the parameters of Adam. Note the learning_rate is not here.\n",
        "    optax.scale_by_adam(b1=0.9, b2=0.999, eps=1e-8),\n",
        "    # Puts a minus sign to *minimize* the loss.\n",
        "    optax.scale(-LEARNING_RATE)\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dZhCXZC0qpV1"
      },
      "source": [
        "We then pass the initial parameters of the model to the optimizer to initialize it."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "1Oukzb31fbyZ"
      },
      "outputs": [],
      "source": [
        "opt_state = tx.init(params)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eOpZ_zZ_qwWz"
      },
      "source": [
        "Finally, we train the model for `NUM_STEPS` steps."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "l09Gos8pfzXU"
      },
      "outputs": [],
      "source": [
        "loss_history = []\n",
        "\n",
        "# Minimizes the loss.\n",
        "for _ in range(NUM_STEPS):\n",
        "  # Computes gradient of the loss.\n",
        "  loss_val, grads = loss_grad_fn(params)\n",
        "  loss_history.append(loss_val)\n",
        "  # Updates the optimizer state, creates an update to the params.\n",
        "  updates, opt_state = tx.update(grads, opt_state)\n",
        "  # Updates the parameters.\n",
        "  params = optax.apply_updates(params, updates)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 294
        },
        "executionInfo": {
          "elapsed": 179,
          "status": "ok",
          "timestamp": 1702312436820,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 0
        },
        "id": "frb0aKw7jhee",
        "outputId": "f57e2f1a-f73e-4905-a6d7-b7a6c0fea872"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAvwAAAIqCAYAAABYP569AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAABYlAAAWJQFJUiTwAABoDUlEQVR4nO3dd3RVVd7G8eemF0JCCgkQIIQQqrQgvYuIqBSJiDQREEVBYNSRGcuI9XVsWFGxgCCogFIcpQihhg7SO6FJTSAVUu95/0CuxoSWdnJvvp+1WGvOPvvc+7tzYvJkZ5+9LYZhGAIAAADgkJzMLgAAAABA8SHwAwAAAA6MwA8AAAA4MAI/AAAA4MAI/AAAAIADI/ADAAAADozADwAAADgwAj8AAADgwAj8AAAAgAMj8AMAAAAOjMAPAAAAODACPwAAAODACPwAAACAAyPwAwBuSlhYmCwWi5YvX15i7/niiy/KYrFoyJAhJfaeAOAoCPwAUEpZLJYC/evYsaPZpQMAShEXswsAAOQvODg43/bz588rKytLHh4e8vX1zXPe39+/WOuqWbOmPDw85OXlVazvAwAoGgR+ACilTp8+nW97x44dtWLFCt1///2aMmVKyRYlaenSpSX+ngCAgmNKDwAAAODACPwA4ECGDBkii8WiF198URkZGXr11VfVsGFD+fj4yGKxKDExUZKUmpqqWbNmacCAAWrQoIH8/Pzk6empiIgIjRgxQgcOHLjqe1ztod0pU6bkeoZgwYIF6tSpk/z8/FSuXDm1bNlSM2fOLJbPbbVa9cUXX6hDhw7y9/eXh4eHatSooREjRujgwYNXvS4uLk4jR45UZGSkPD095eXlperVq6tjx456/fXXFR8fn+d9pkyZok6dOikgIECurq4KCgpS/fr1NXToUC1cuLBYPh8AFAZTegDAAaWnp6t9+/basGGDXF1d88y3nzJlikaPHm079vHxkdVq1aFDh3To0CHNmDFDc+fOVZcuXQr0/i+//LJeeOEFOTk5ycfHR2lpaVq/fr369++vM2fOaOzYsYX5eLlcvHhRvXv31uLFiyXJ9nmPHDmiyZMna9q0afr222/Vs2fPXNdt2bJFHTt2VEpKiu06b29vHTt2TMeOHdOKFSvUpEkTdevWzXbNoEGDNGPGDNuxr6+vkpOTFR8fr927d2v37t25+gNAacAIPwA4oI8++kj79+/Xt99+q9TUVCUmJurIkSPy9vaWJAUEBGj06NGKjY1VYmKikpOTlZ6erj179mjAgAFKS0tT//79lZaWdtPvvW3bNk2YMEEvv/yyEhISlJiYqNOnTys6OlqS9K9//Uvnz58vss/6j3/8Q4sXL5a7u7s++eQTpaSkKDExUfv27VPHjh2Vnp6u/v37a//+/bmue+qpp5SSkqIWLVpoy5YtyszM1IULF5SWlqaNGzdq7NixuR6KXrlypWbMmCEnJye9++67Sk5OVmJiotLT03Xy5ElNmTJFbdu2LbLPBQBFxgAA2JUOHToYkowHH3wwz7kHH3zQkGRIMhYtWlSg17darUaXLl0MScaUKVPynK9evbohyYiJicnV/tVXX9ne+5VXXslz3aVLl4ygoCBDkjF16tSbquk///lPvp/5yJEjhpOTkyHJ+OSTT/Jcl5aWZtSsWdOQZAwaNCjXOU9PT0OSsW7duhuq4Y033jAkGd26dbup2gHAbIzwA4ADatiwobp27Vqgay0Wi+666y5J0po1a276eg8Pj3yn7Hh4eOiOO+6QJO3cubNAtf3dDz/8IKvVqpCQEA0fPjzPeS8vL/3zn/+09c3JybGdK1++vCTp1KlTN/ReV/qfPXtWVqu1sKUDQIkh8AOAA2rVqtV1+5w4cULPPPOMoqKi5OfnJ2dnZ9vmXePGjZMknTx58qbfu169erapQ39XpUoVSdKFCxdu+nXzs2XLFklSu3bt5OzsnG+fzp07S5LS0tK0b98+W3v37t0lSYMHD9b48eO1bt06ZWVlXfW9unTpIjc3N9vc/+nTpxfo/x8AKGkEfgBwQEFBQdc8v2LFCtWtW1f//e9/tWXLFiUlJcnHx0fBwcEKDg62jWYXZA6/j4/PVc95eHhI0jWD9c04d+6cpD9/kchPaGhonv6S9Oabb6p169ZKSUnRG2+8oVatWql8+fLq3LmzJk2apEuXLuV6nYiICE2aNEmenp5atWqVBg0apCpVqqhGjRoaOXKktm7dWiSfCQCKGoEfABzQ1Ua7pcthe+DAgUpNTVWXLl20cuVKXbp0yfZw7enTp/XOO+9IkgzDKKmSCyUjI+Oq5ywWS77tAQEBWr16tZYsWaInnnhCTZo0UWZmpmJiYvTYY4+pQYMGOnHiRK5rhg4dqri4OE2cOFE9e/ZUQECAjhw5ok8++URRUVF67bXXivRzAUBRIPADQBmzdu1anThxQv7+/po3b57atWtnG3m/4syZMyZVd3Ou/CXj6NGjV+1z/PjxPP2vsFgs6tKli9577z1t2bJF8fHx+vTTT+Xv76/Dhw/bpjb9VXBwsMaMGaO5c+fq3Llz2rBhg3r37i3DMPT8889r+/btRfTpAKBoEPgBoIy5MmodGRmZZ33+K3799deSLKnAmjZtKklav369Ll68mG+fZcuWSZK8vb1Vu3bta75ehQoVNGLECNtI/YoVK67Z32Kx6NZbb9WsWbMUGhoqq9Wq1atX3+zHAIBiReAHgDLmytryBw4cUHp6ep7zixcvVkxMTEmXVSD33nuvnJyclJCQoM8++yzP+YsXL+rNN9+09b0y1clqtSo7O/uqr+vp6Skp91ShzMzMq/Z3dnaWq6trnmsAoDQg8ANAGdOmTRt5eXkpISFBgwcPti1LeenSJX355Zfq06ePAgICTK7yxlSvXl0jRoyQJI0fP16fffaZLXDv379fd911lw4ePCgvLy8999xztuuSk5MVERGhV199VTt27LAt12m1WrV06VI9++yzkmRbRlSS/v3vfys6Olpz587NtXHYmTNn9MQTTyguLk4Wi0W33357sX9uALgZBH4AKGP8/Pz0+uuvS5JmzZqlypUry8/PT+XLl9ewYcMUERGh//znPyZXeePefvtt3X777crIyNAjjzwiHx8fVahQQbVr19by5cvl7u6uGTNmKDIyMtd1R48e1XPPPaeGDRvK09NTAQEBcnNzU5cuXXTixAmFh4fbHl6WpOzsbM2ZM0e9e/dWQECAfH19Vb58eYWEhOiDDz6QJL3yyitq0KBBiX5+ALgeAj8AlEFPPPGEfvjhB9tof3Z2turUqaMJEyYoNjb2mktrljZeXl765Zdf9Pnnn6tdu3by8vLSxYsXVb16dQ0fPlw7duxQz549c11Tvnx5/fTTTxo7dqyaN2+uoKAgpaSkyNvbW7feeqteffVV/fbbb7mW9Bw3bpzef/999ezZU5GRkTIMQxkZGapataruv/9+rVy5Uv/+979L+uMDwHVZDHtZcw0AAADATWOEHwAAAHBgBH4AAADAgRH4AQAAAAdG4AcAAAAcGIEfAAAAcGAEfgAAAMCBEfgBAAAAB0bgBwAAABwYgR8AAABwYAR+AAAAwIG5mF2AvQsLC1NycrJq1KhhdikAAABwYHFxcSpfvryOHDlyU9cR+AspOTlZ6enpZpcBAAAAB1fQzEngL6QrI/ubN282uRIAAAA4sqioqAJdxxx+AAAAwIHZXeB/5plndNttt6lq1ary9PSUv7+/mjRpogkTJighISHfa2JjY9W9e3f5+/vLy8tLDRs21MSJE5WTk1PC1QMAAAAly2IYhmF2ETfDzc1NTZs2Vb169VSxYkWlpaVp3bp12rRpkypXrqx169apatWqtv7z5s1Tnz595OHhofvvv1/+/v5asGCB9u3bp+joaM2aNatQ9Vz50wpTegAAAFCcCpo77S7wp6eny8PDI0/7s88+q9dee00jR47Uxx9/LOnyA7URERFKSkrSmjVr1KxZM9trdO7cWWvXrtXMmTPVr1+/AtdD4AcAAEBJKGjutLspPfmFfUnq27evJOnAgQO2ttmzZ+vcuXPq16+fLexfeY1XXnlFkjRp0qRirBYAAAAwl90F/qtZsGCBJKlhw4a2tmXLlkmSunXrlqd/+/bt5eXlpdjYWGVkZJRMkQAAAEAJs9tlOd966y2lpqYqKSlJmzZt0urVq9WwYUONHz/e1mffvn2SpMjIyDzXu7i4qEaNGtq1a5cOHz6sunXrXvP9rrYM0p49e657LQAAAGAWuw78Z86csR1369ZNU6ZMUVBQkK0tKSlJkuTr65vva1xpT0xMLL5CAQAAABPZbeA/ffq0JOnMmTOKjY3V+PHj1aRJE/30009q2rTpDb3GleeVLRbLdfte7eGIgm6AAAAAAJQEu5/DHxwcrN69e2vx4sVKSEjQ4MGDbeeujOBfGen/u+Tk5Fz9AAAAAEdj94H/iurVq6tevXratWuX4uPjJUm1a9eWJO3fvz9P/+zsbMXFxcnFxUXh4eElWisAAABQUhwm8EvSyZMnJUnOzs6SpM6dO0uSFi5cmKfvypUrdfHiRbVu3Vru7u4lVyQAAABQguwq8O/du9c2d/+vrFarnn32WZ09e1atW7dWhQoVJEnR0dEKDAzUt99+q02bNtn6p6en67nnnpMkjRw5smSKBwAAAExgVw/tLly4UE8//bTat2+vmjVrKiAgQGfOnNGKFSt0+PBhhYSEaPLkybb+5cuX1+TJkxUdHa2OHTuqX79+8vf31/z587Vv3z5FR0fr/vvvN/ETAQAAAMXLrgJ/ly5dNGLECK1Zs0bbtm1TYmKivL29FRkZqUGDBumJJ56Qv79/rmt69eqlFStW6NVXX9WcOXOUnp6uiIgIvfPOO3riiSduaIUeAAAAwF5ZjCtrU6JArizLebVlO4tLdo5VP279XX2ahsrJiV9aAAAAHF1Bc6ddjfDjsjPJ6Ro9c6s2xJ3XudQMPdYxwuySAAAAUErZ1UO7uGzmhmPaEHdekvT24v22/w0AAAD8HYHfDj3eKULNql9eiSjHauiJmVt1Pi3T5KoAAABQGhH47ZCrs5Pef6CJKni5SpJOJ6frH9//JquVxzEAAACQG4HfTlX289Q7fRvbjpfvO6dPVx42ryAAAACUSgR+O9apTkU92qGm7fitxfu08Qjz+QEAAPAnAr+de7JrpKL+Mp9/9Azm8wMAAOBPBH475+rspA8eaCI/5vMDAAAgHwR+B3B5Pn8j2zHz+QEAAHAFgd9BdK4TrEc6hNuO31q8j/X5AQAAQOB3JE91rZ17Pv/MLYpPzTC5KgAAAJiJwO9AXJ2d9GH/P9fnP5OcoTHfblUO8/kBAADKLAK/g6nk66mJ/ZrIYrl8vOZggt5fesDcogAAAGAaAr8D6hAZpNGdImzH7y87oJX7z5lYEQAAAMxC4HdQY7pEqnXNAEmSYUhjv/tNp5PSTa4KAAAAJY3A76CcnSx6r18TBfm4S5LOp2Vq1IwtysqxmlwZAAAAShKB34EF+bjrgweayOmP+fybjl7Qm4v2mVsUAAAAShSB38G1DA/QU3fUth1/tvKwFu48bWJFAAAAKEkE/jLg0fY11blORdvx07O2KS4+zcSKAAAAUFII/GWAk5NF7/RtpNAKnpKklIxsjZy+WZcyc0yuDAAAAMWNwF9G+Hm5adKAKLk5X77le0+n6Lm5O2UYbMoFAADgyAj8Zcgtob6a0LO+7XjOlhP6duNxEysCAABAcSPwlzH9bq2qPk1Dbcf/mbdLO04kmVgRAAAAihOBv4yxWCx6pVcD1QnxkSRl5lg18pvNSryYaXJlAAAAKA4E/jLI081ZnwyMko+7iyTpxIVLGvfdb7Jamc8PAADgaAj8ZVRYoLfe6tvIdhyz75w+WHbQxIoAAABQHAj8Zdgd9UP0SIdw2/HEpfsVs++siRUBAACgqBH4y7inu9ZWq/AASZJhSGNmbtWxhIsmVwUAAICiQuAv41ycnfRB/yaq5OshSUpOz9YjbMoFAADgMAj8UGA5d00a+OemXHtOJevZuTvYlAsAAMABEPghSWpc1U//6VHPdvzDlt81fd1REysCAABAUSDww6Z/82q6L+rPTble+mm3Nh+9YGJFAAAAKCwCP2wsFote7tVADaqUlyRl5Rh67JvNOpuSbnJlAAAAKCgCP3LxcHXWpAFR8vNylSSdSc7Q499sUWa21eTKAAAAUBAEfuRR1d9L7/drIifL5eONRy7o1f/tNrcoAAAAFAiBH/lqHxmkp+6obTueuvaoZm06bmJFAAAAKAgCP65qZIea6n5LiO342bk7tf1EonkFAQAA4KYR+HFVFotFb0Y3UmRwOUlSZrZVj07brPjUDJMrAwAAwI0i8OOavN1d9OmgZvLxcJEknUxK1+PfbFFWDg/xAgAA2AMCP66rRqC33uvXWJY/HuJdH3der/+819yiAAAAcEMI/LghnesE6x9dIm3HX66J0w9bTphYEQAAAG4EgR837PFOEepaL9h2PP6HHTzECwAAUMoR+HHDnJwsertvI0VU/PMh3kemsRMvAABAaUbgx03x8XDV5MHNVP6Ph3hPJaXrsensxAsAAFBaEfhx02oEeuuD/k1tO/FuOnpB/5m/U4ZhmFsYAAAA8iDwo0A6RAbpmW51bMczNxzX9PXHTKwIAAAA+SHwo8BGtA9Xz8aVbccT5u/S+sMJJlYEAACAvyPwo8AsFove6NNQDaqUlyRlWw099s0W/Z54yeTKAAAAcAWBH4Xi4eqsTwc1U4C3myQpIS1TD0/dpIuZ2SZXBgAAAInAjyJQxc9TkwZGyeWPp3h3n0rWU7O2yWrlIV4AAACzEfhRJJrX8NdLPRvYjn/ecVrvLztgYkUAAACQCPwoQv1bVNODrarbjif+ekC/7DhlYkUAAAAg8KNIPX93PbWJCLAd/+P7bdp1MsnEigAAAMo2Aj+KlIuzkz7q31RhAV6SpEtZOXp46iadS8kwuTIAAICyicCPIufn5abPH2wmH3cXSdLJpHQ9On2zMrJzTK4MAACg7CHwo1hEVPTR+w80keXywj3afPSCnvtxpwyDlXsAAABKEoEfxaZTnYr61511bMezNp/Q5FWHTawIAACg7CHwo1g93C5cfZqG2o5f/2Wvluw+Y2JFAAAAZQuBH8XKYrHotXsb6NawCpIkw5DGfLtVu08mm1wZAABA2UDgR7Fzd3HWJwOjVNXfU5J0MTNHw6du1NmUdJMrAwAAcHwEfpSIgHLu+uLBW3Ot3PPItM1Kz2LlHgAAgOJE4EeJiQz20fv9m8jpj5V7th5L1DNztrNyDwAAQDEi8KNEdapdUc/dVc92PO+3k/pw2UETKwIAAHBsBH6UuIfahKl/i2q247eX7NeCbSdNrAgAAMBxEfhR4iwWiyb0qK82EQG2tidnbdPmoxdMrAoAAMAxEfhhCldnJ33cP0o1g7wlSZnZVo34epOOn79ocmUAAACOhcAP0/h6uerLIbfK39tNkpSQlqmHpmxU0qUskysDAABwHAR+mKp6gLc+GxQlN+fLX4oHz6bq8W+2KCvHanJlAAAAjoHAD9M1C/PXm/c1tB2vPhivF+btZLlOAACAIkDgR6nQs3EVjesSaTueueG4Jq86bGJFAAAAjoHAj1Ljidsi1LtJFdvx67/s1S87TplYEQAAgP0j8KPUsFgs+r8+t+jWsAqSJMOQxn73m7YcY7lOAACAgiLwo1Rxd3HWZ4OaqUbg5eU6M7KtGj51k44mpJlcGQAAgH0i8KPUqeDtpq/+slzn+bRMPfTVRl1IyzS5MgAAAPtD4EepFBborcmDm8nN5fKX6OH4NI2YtknpWTkmVwYAAGBfCPwotaKqV9DE+xvbjjceuaCnZ2+X1cpynQAAADfKrgJ/QkKCPv/8c/Xu3VsRERHy9PSUr6+v2rZtqy+++EJWa+7Nmo4cOSKLxXLVf/369TPpk+BGdb+lkv7dvY7teMG2k3pr8T4TKwIAALAvLmYXcDNmzZqlkSNHqlKlSurUqZOqVaumM2fO6IcfftDw4cP1yy+/aNasWbJYLLmua9SokXr16pXn9Ro0aFBClaMwHm4XrmPnL2r6umOSpI+XH1KVCp4a0KK6yZUBAACUfnYV+CMjIzV//nzdddddcnL6848Tr732mpo3b645c+bohx9+UJ8+fXJd17hxY7344oslXC2KisVi0Yv31NfJxHQt23tWkvT83J0KKe+h2+oGm1wdAABA6WZXU3o6d+6se+65J1fYl6SQkBA9+uijkqTly5ebUBmKm4uzkz54oIluqeIrSbIa0qgZW/Xb8URzCwMAACjl7CrwX4urq6skycUl7x8tTp48qU8//VSvvfaaPv30U23fvr2ky0MR8HZ30ZdDblVVf09J0qWsHA2bslFH4lmjHwAA4GrsakrP1WRnZ+vrr7+WJHXr1i3P+SVLlmjJkiW52jp27KipU6eqWrVqN/QeUVFR+bbv2bNHdevWvcmKUVBBPu6a8lBzRU+K1YWLWUpIy9SQrzZozsjWCijnbnZ5AAAApY5DjPCPHz9eO3fuVPfu3XXHHXfY2r28vPT8889r8+bNunDhgi5cuKAVK1aoU6dOWr58uW677TalpTE6bG9qBpXT5w82k/sfa/QfSbioYVM36VIma/QDAAD8ncUwDLte1Pz999/XmDFjVKdOHa1Zs0b+/v7XvSY7O1tt27bV+vXrNXHiRI0ZM6bA739l5H/z5s0Ffg0UzMKdpzXym8268hXcpW6wPhnYVC7ODvF7LAAAQC4FzZ12nYw++ugjjRkzRvXq1VNMTMwNhX3p8jz/4cOHS5JWrlxZnCWiGHVrEKIX76lvO/51zxk9P2+X7Px3WAAAgCJlt4F/4sSJGjVqlBo0aKCYmBiFhITc1PVBQUGSxJQeO/dg6zA90j7cdjxzwzG9t/SAiRUBAACULnYZ+N944w2NGzdOjRs3VkxMjCpWrHjTr7Fu3TpJUnh4+HV6orR7plsd9Wpc2XY88dcDmrH+mIkVAQAAlB52F/hffvlljR8/XlFRUVq6dKkCAwOv2nf9+vXKzMzM075s2TK9++67kqSBAwcWW60oGU5OFv03upHa1frza+G5uTu0eNdpE6sCAAAoHezqod2pU6dqyJAhcnZ21ujRo+Xr65unT1hYmIYMGSLp8tKbu3btUseOHRUaGipJ2r59u5YtWybp8i8Pzz33XKFq4qHd0iM1I1sPfLZOO35PkiS5uzjpm+Et1Czsxp7tAAAAKM0Kmjvtah3+uLg4SVJOTo4mTpyYb58OHTrYAv+gQYP0448/auPGjfrll1+UlZWl4OBg9e3bV6NGjVK7du1KqHKUhHLuLvrqoVvVZ1KsjiZcVEa2VUOnbNTska0VGexjdnkAAACmsKsR/tKIEf7S52hCmvpMilV86uXpXJV8PTRnZGtV9vM0uTIAAICCK5PLcgL5qR7gra+GNJe3m7Mk6VRSugZ/uUEX0vI+zwEAAODoCPxwSLeE+uqTQVFydbZIkg6eTdVDUzYqLSPb5MoAAABKFoEfDqtdrSC907exLJczv347nqiR32xRZrbV3MIAAABKEIEfDu2eRpX1Uo8/d+Nduf+cnpq1TVYrj64AAICygcAPhzeoVZjG3FbLdjx/20lNWLBLPK8OAADKAgI/yoSxXWppcKvqtuOpa4/qg2UHTawIAACgZBD4USZYLBa9eE993d2wkq3tnSX7NW3dUROrAgAAKH4EfpQZTk4WvdO3sdrVCrS1vTBvp+b99ruJVQEAABQvAj/KFDcXJ30yMEqNqvpJkgxD+sf327R0zxlzCwMAACgmBH6UOd7uLpr60K2KDC4nScqxGnrsmy1adzjB5MoAAACKHoEfZZKfl5umDWuhav5ekqSMbKuGT92k7ScSzS0MAACgiBH4UWYFl/fQ9GEtVNHHXZKUmpGtB7/coINnU0yuDAAAoOgQ+FGmVQvw0rRhLeTr6SpJunAxSwM/36Dj5y+aXBkAAEDRIPCjzKsd4qMpD90qLzdnSdLp5HQN/GK9zianm1wZAABA4RH4AUlNqlXQ5MHN5OZ8+T+JowkXNfCL9TqflmlyZQAAAIVD4Af+0CYiUB/2byJnJ4skaf+ZVA3+cr2S07NMrgwAAKDgCPzAX3StH6J3+jaS5XLm187fkzX0q426mJltbmEAAAAFROAH/qZn4yp6vfcttuNNRy/okWmblZ6VY2JVAAAABUPgB/LRr3k1PX93PdvxqgPxGj1zq7JyrCZWBQAAcPMI/MBVDGtbQ/+4PdJ2vGT3GT35/TblWA0TqwIAALg5BH7gGkZ3jtAjHcJtx/O3ndT4OdtlJfQDAAA7QeAHrsFisWh8tzoa1LK6rW3W5hN6ft5OGQahHwAAlH4EfuA6LBaLJvSor77NQm1t36w/ppd+2k3oBwAApR6BH7gBTk4WvX5vQ/VqXNnW9tWaI3pj4T5CPwAAKNUI/MANcnay6K37Gqn7LSG2tk9WHNJ7Sw+YWBUAAMC1EfiBm+Di7KT3+jVRl7rBtraJvx7Qx8sPmlgVAADA1RH4gZvk6uykjwY0UYfIIFvbfxfu0+SVh02sCgAAIH8EfqAA3F2c9emgKLUKD7C1vfrzHn2xOs7EqgAAAPIi8AMF5OHqrC+GNFPzGv62tpd/2q2psUfMKwoAAOBvCPxAIXi5ueirIbeqWfUKtrb/zN+laeuOmlgVAADAnwj8QCF5u7toytDmalrNz9b2/NydmrH+mHlFAQAA/IHADxSBcn+E/kZV/Wxt//5xh77bSOgHAADmIvADRaS8h6u+HtpcDUN9bW3jf9ih7zceN7EqAABQ1hH4gSLk6+mqaUNbqH7l8pIkw5Ce+WE7oR8AAJiGwA8UMV8vV30zPHfo/+ec7UzvAQAApiDwA8XAz8tN3wxvoQZVytvanpmzQ99uIPQDAICSReAHiomfl5umD8sd+sf/sEMzCf0AAKAEEfiBYuTn5aZvhrXULVX+fJD3Xz/sYMlOAABQYgj8QDHz9XLV9GEtcq3e8+8fd7A5FwAAKBEEfqAE+Hq5atqwFmr0l9D//Nyd+mpNnIlVAQCAsoDAD5QQX09XfT2shRr/ZXOuCQt2a/LKw+YVBQAAHB6BHyhBvp6umjasuaKqV7C1vfrzHn0Uc9DEqgAAgCMj8AMlzOePHXmb1/C3tb25aJ8m/rpfhmGYWBkAAHBEBH7ABN7uLpry0K1qXTPA1jbx1wN6ezGhHwAAFC0CP2ASLzcXfTnkVrWrFWhr+zDmoF77eQ+hHwAAFBkCP2AiD1dnTR7cTJ3rVLS1TV4Vp+fn7ZTVSugHAACFR+AHTObh6qxPBkbpjvrBtrbp647pn3O2K4fQDwAAConAD5QCbi5O+rB/U/VoVNnWNnvzCY35dquycqwmVgYAAOwdgR8oJVydnfTu/Y3Vt1more2n7af02DdblJGdY2JlAADAnhH4gVLE2cmi/7u3oR5sVd3WtmT3GT389WZdyiT0AwCAm0fgB0oZJyeLXuxRX4+0D7e1rdx/Tg9+tUEp6VkmVgYAAOwRgR8ohSwWi8bfWUdju9SytW2IO68Bn6/XhbRMEysDAAD2hsAPlFIWi0Vju0Tq393r2Nq2n0jS/Z+t1dnkdBMrAwAA9oTAD5RyI9rX1Ku9G8hiuXy8/0yq7vt0rY6fv2huYQAAwC4Q+AE7MKBFdU28v7GcnS6n/qMJF9X307U6dC7V5MoAAEBpR+AH7ETPxlX0ycAoublc/s/2VFK6+n6yVrtOJplcGQAAKM0I/IAdub1esL4acqu83JwlSQlpmer32TptPHLe5MoAAEBpReAH7EybiEBNG9ZC5T1cJEkp6dka9MV6xew9a3JlAACgNCLwA3YoqnoFffdIKwWWc5ckpWdZ9fDXmzTvt99NrgwAAJQ2BH7ATtWtVF6zH22l0AqekqRsq6Gx3/2mr9ceMbcwAABQqhD4ATsWFuit2Y+2VmRwOUmSYUgvzNul95cekGEYJlcHAABKAwI/YOdCfD30/SOt1Liqn63tnSX79dJPu2W1EvoBACjrCPyAA/DzctM3w1uobUSgre2rNUc07vvflJltNbEyAABgNgI/4CC83V30xZBm6n5LiK1t3m8nNfzrTbqYmW1iZQAAwEwEfsCBuLs464MHmqp/i2q2tpX7z6n/5PW6kJZpYmUAAMAsBH7AwTg7WfRqrwYac1stW9tvxxMV/Umsfk+8ZGJlAADADAR+wAFZLBaNuz1SL/esL4vlctuhc2mKnhSrA2dSzC0OAACUKAI/4MAGtQrTBw80kavz5dR/Kild0Z+s1aYj502uDAAAlBQCP+Dg7m5YWVMeai5vN2dJUtKlLA34fL0W7zptcmUAAKAkEPiBMqBNRKC+HdFKgeXcJEkZ2VY9On2zvll/1OTKAABAcSPwA2XELaG+mjOytaoHeEmSrIb07I879c7ifezKCwCAAyPwA2VI9QBvzRnZWg1DfW1t7y87qPFzdig7hw26AABwRAR+oIwJLOeumQ+3VIfIIFvbd5uOa8S0zWzQBQCAAyLwA2WQt7uLPn+wme5tWsXWtmzvWT3w2TqdS8kwsTIAAFDUCPxAGeXq7KS372ukxzrWtLVtO5Gkeyet0eFzqSZWBgAAihKBHyjDLBaL/tmtjl7uWV9Of2zQdfz8JfWZFKvNR1mrHwAAR2BXgT8hIUGff/65evfurYiICHl6esrX11dt27bVF198Ias1/4cOY2Nj1b17d/n7+8vLy0sNGzbUxIkTlZOTU8KfACidBrUK06eDmsnD9fK3hAsXs9R/8not3HnK5MoAAEBh2VXgnzVrlh5++GGtX79eLVq00NixY9WnTx/t3LlTw4cPV9++ffMsLzhv3jy1b99eK1euVO/evfX4448rMzNT48aNU79+/Uz6JEDpc3u9YM18uKUCvP9cq3/kN1v05eo4kysDAACFYTHsaAHuZcuWKS0tTXfddZecnP78XeX06dNq3ry5jh8/rtmzZ6tPnz6SpOTkZEVERCgpKUlr1qxRs2bNJEnp6enq3Lmz1q5dq5kzZxYq+EdFRUmSNm/eXIhPBpQeRxPSNOSrjYqLT7O1DW1TQ8/eVVfOV+b9AACAElfQ3GlXI/ydO3fWPffckyvsS1JISIgeffRRSdLy5ctt7bNnz9a5c+fUr18/W9iXJA8PD73yyiuSpEmTJhV/4YAdubJWf9Nqfra2L9fEaeT0zbqUyTQ4AADsjV0F/mtxdXWVJLm4uNjali1bJknq1q1bnv7t27eXl5eXYmNjlZHBMoTAX/l7u2nGwy3VrX6IrW3x7jPq99lalu0EAMDOOETgz87O1tdffy0pd7jft2+fJCkyMjLPNS4uLqpRo4ays7N1+PDh675HVFRUvv/27NlTRJ8CKF08XJ318YCmerhdDVvbthNJ6v3xGh04k2JiZQAA4GY4ROAfP368du7cqe7du+uOO+6wtSclJUmSfH19873uSntiYmKx1wjYIycni569q16uZTtPXLikeyfFKvZQvLnFAQCAG+Jy/S6l2/vvv6+3335bderU0bRp027q2ivPK1ss138Q8WoPR1x5eAJwZINahalKBU+NmrFVFzNzlJKerQe/3KDX722o6KhQs8sDAADXYNcj/B999JHGjBmjevXqKSYmRv7+/rnOXxnBvzLS/3fJycm5+gG4us51gvX9I61U0cddkpSVY+ipWdv05qK9slrtZrEvAADKHLsN/BMnTtSoUaPUoEEDxcTEKCQkJE+f2rVrS5L279+f51x2drbi4uLk4uKi8PDwYq8XcAQNqvhq7uNtVCfEx9b2UcwhjZq5RelZrOADAEBpZJeB/4033tC4cePUuHFjxcTEqGLFivn269y5syRp4cKFec6tXLlSFy9eVOvWreXu7l6s9QKOpLKfp2Y92kodawfZ2n7ecVr3f7ZOZ1PSTawMAADkx+4C/8svv6zx48crKipKS5cuVWBg4FX7RkdHKzAwUN9++602bdpka09PT9dzzz0nSRo5cmSx1ww4Gh8PV30+uJmGtA6ztW07nqjeH8Vq7+lk8woDAAB52NVOu1OnTtWQIUPk7Oys0aNH5zv3PiwsTEOGDLEdz507V9HR0fLw8FC/fv3k7++v+fPna9++fYqOjtb3339/Qw/tXg077aKsmxp7RBMW7NKVafzl3F30wQNN1KlO/n95AwAABVPQ3GlXq/TExcVJknJycjRx4sR8+3To0CFX4O/Vq5dWrFihV199VXPmzFF6eroiIiL0zjvv6IknnihU2AcgPdg6TNUCvDR6xlalZmQrNSNbw6Zu1LN31dPQNmH8NwYAgMnsaoS/NGKEH7hs7+lkDZuySb8nXrK1PdC8qib0aCA3F7ubPQgAQKlT0NxZ6J/CX3/9tbZv356rLTMz07bk5d+tWLFCL730UmHfFkAp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",
            "text/plain": [
              "<Figure size 600x400 with 1 Axes>"
            ]
          },
          "metadata": {
            "image/png": {
              "height": 277,
              "width": 382
            }
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "plt.plot(loss_history)\n",
        "plt.title('Train loss')\n",
        "plt.xlabel('Step')\n",
        "plt.ylabel('MSE')\n",
        "plt.show()"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "provenance": []
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
